﻿using HtmlAgilityPack;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Text;
using System.Threading.Tasks;
using System.Web;

namespace FindLinkRegister
{
    public class RequestHandle
    {

        // các từ khóa tìm kiếm link đăng ký
        private static string[] keyRegisters = new string[] { "đăng ký", "ghi danh", "register", "sign up" }; //, "đăng nhập", "login in"
        private static string[] keyLogins = new string[] { "đăng nhập", "login", "log-in", "log in", "sign in"};
        public static int countFound = 0;

        //public static List<WebsiteDTO> lstResults = new List<WebsiteDTO>();

        /// <summary>
        /// Lấy link đăng ký acc từ 1 link diễn đàn
        /// </summary>
        /// <param name="url">Link diễn đàn</param>
        /// <returns>Link đăng ký diễn đàn</returns>
        public static string GetLinkRegisterByLink(string url)
        {
            string result = "";
            try
            {
                var site = new HtmlWeb();
                var doc = site.Load(url);

                HtmlNodeCollection nodes = doc.DocumentNode.SelectNodes("//a[@href]");
                if (nodes != null)
                {
                    foreach (var node in nodes)
                    {
                        if (node == null)
                            continue;
                        string str = node.InnerHtml.ToString();
                        string key = "";
                        // so sanh voi list tu khoa
                        if (CompareStringWithKeys(str, keyRegisters, ref key))
                        {
                            // lấy link đăng ký
                            result = node.Attributes["href"].Value.Trim();
                            countFound++;
                            break;
                        }
                    }
                }

            }
            catch
            {
                return "";
            }
            if (result == "")
                return "";
            // xử lý link đăng ký lại
            if(result.IndexOf("http://") != -1)
                if (CheckUrlConnected(result))
                    return result;
            return url + "/" + result;
        }

        /// <summary>
        /// Lấy link đăng ký acc từ 1 link diễn đàn *** Cập nhật List, ko giá trị trả về
        /// </summary>
        /// <param name="url"></param>
        public static void GetLinkRegisterByLinks(string url)
        {
            string result = "";
            WebsiteDTO web = new WebsiteDTO();
            web.LinkWebsite = url;
            try
            {
                var site = new HtmlWeb();
                var doc = site.Load(url);

                HtmlNodeCollection nodes = doc.DocumentNode.SelectNodes("//a[@href]"); 
                if (nodes != null)
                {
                    foreach (var node in nodes)
                    {
                        if (node == null)
                            continue;
                        string str = node.InnerHtml.ToString();
                        string key = "";
                        // so sanh voi list tu khoa
                        if (CompareStringWithKeys(str, keyRegisters, ref key))
                        {
                            // lấy link đăng ký
                            result = node.Attributes["href"].Value.Trim();
                            countFound++;
                            
                            break;
                        }
                    }
                }

            }
            catch
            {
                result = "";
                web.LinkResult = result;
            }

            // xử lý link đăng ký lại
            if (result == "")
            {
                web.LinkResult = "";
            }
            else
            {
                if (result.IndexOf("http://") != -1)
                {
                    if (CheckUrlConnected(result))
                        web.LinkResult = result;
                    else
                        web.LinkResult = "";
                }
                else
                {
                    if (CheckUrlConnected(url + "/" + result))
                        web.LinkResult = url + "/" + result;
                    else
                        web.LinkResult = "";
                }
            }

            // add to list results    
            lock (Form1._lstResults)
            {
                Form1._lstResults.Add(web);
            }
        }

        /// <summary>
        /// Lấy link LOGIN acc từ 1 link diễn đàn *** Cập nhật List, ko giá trị trả về
        /// </summary>
        /// <param name="url"></param>
        public static void GetLinkLoginByLinks(string url)
        {
            string result = "";
            WebsiteDTO web = new WebsiteDTO();
            web.LinkWebsite = url;
            try
            {
                var site = new HtmlWeb();
                var doc = site.Load(url);

                HtmlNodeCollection nodes = doc.DocumentNode.SelectNodes("//a[@href]");
                if (nodes != null)
                {
                    foreach (var node in nodes)
                    {
                        if (node == null)
                            continue;
                        string str = node.InnerHtml.ToString();
                        string key = "";
                        // so sanh voi list tu khoa
                        if (CompareStringWithKeys(str, keyLogins, ref key))
                        {
                            // lấy link đăng ký
                            result = node.Attributes["href"].Value.Trim();
                            countFound++;

                            break;
                        }
                    }
                }

            }
            catch
            {
                web.LinkResult = url;
            }

            // xử lý link 
            if (result == "")
            {
                web.LinkResult = url;
            }
            else
            {
                if (result.IndexOf("http://") != -1)
                {
                    if (CheckUrlConnected(result))
                        web.LinkResult = result;
                    else
                        web.LinkResult = url;
                }
                else
                {
                    if (CheckUrlConnected(url + "/" + result))
                        web.LinkResult = url + "/" + result;
                    else
                        web.LinkResult = url;
                }
            }

            // add to list results    
            lock (Form1._lstResults)////////////////////////////////////////
            {
                Form1._lstResults.Add(web);//////////////////////////////////
            }
        }


        /// <summary>
        /// Kiểm tra link có tồn tại
        /// </summary>
        /// <param name="url"></param>
        /// <returns></returns>
        public static bool CheckUrlConnected(string url)
        {
            try
            {
                Uri urlCheck = new Uri(url);
                //Creating the HttpWebRequest
                HttpWebRequest request = WebRequest.Create(urlCheck) as HttpWebRequest;
                //Setting the Request method HEAD, you can also use GET too.
                request.Method = WebRequestMethods.Http.Get;
                //set timeout
                request.Timeout = 5000;
                //Getting the Web Response.
                HttpWebResponse response = request.GetResponse() as HttpWebResponse;
                //Returns TRUE if the Status code == 200
                //MessageBox.Show(response.StatusCode.ToString());
                if (response.StatusCode == HttpStatusCode.OK)
                    return true;
                return false;
            }
            catch
            {
                //Any exception will returns false.
                return false;
            }
        }

        /// <summary>
        /// So sánh danh sách các key với 1 chuổi 
        /// </summary>
        /// <param name="str">chuổi so sánh</param>
        /// <param name="keys">các từ khóa cần so sánh</param>
        /// <param name="kq">từ khóa đúng nhất</param>
        /// <returns></returns>
        private static bool CompareStringWithKeys(string str, string[] keys, ref string kq)
        {
            for (int i = 0; i < keys.Length; i++)
            {
                if (str.ToLower().Trim().IndexOf(keys[i].ToLower().Trim()) != -1)
                {
                    kq = keys[i];
                    return true;
                }
            }
            return false;
        }
    }

    

}
